#include "cryptolib.h"

/**
* @brief Der Konstruktor zu CryptoLib
*
* @param[in] MOD Die Anzahl der möglichen Buchstaben im Alphabet (26).
* @param[in] ADD Die Anzahl der Verschiebung im Alphabet.
* @param[in] crypttype Die Verschlüsselungsmethode.
*
* Initialisiert Variablen
*/
CryptoLib::CryptoLib(int MOD, int ADD, int crypttype){

    //Caesart
    if (crypttype == 0)
    {
        this->MOD=MOD;
        this->ADD=ADD;
    }
}

/*!
Verschlüsselt Ceasar
@param[in] MODE Hier wird eingestellt ob ver- oder entschlüsselt wird.
@param[in] text Der zu ver- oder entschlüsselnde Text.
*/
QString CryptoLib::easy_crypt(int MODE, string text){
    char tmp[256];
    char encrypted[256];
    strcpy(tmp,text.c_str());
    if(MODE==ENCRYPT){
        for(int nr=0;nr<text.length();nr++){
            int base = ((int)tmp[nr])-97;
            encrypted[nr] = Vector[(base+ADD)%MOD];
        }
    }else if(MODE==DECRYPT){
        for(int nr=0;nr<text.length();nr++){
            int base = ((int)tmp[nr])-97;
            encrypted[nr] = Vector[(base+MOD-ADD)%MOD]; // inverse
        }
    }
    encrypted[text.length()]='\0';
    return ((QString::fromStdString(string(encrypted))));
}

/*!
Verschlüsselt jedes Byte in dem XOR aus beiden Dateien gebildet wird. Sollte der Schlüssel zu kurz sein,
wird er passend verlängert, ist er zu lang wird er abgeschnitten.
@param[in] inputfile Der Inhalt der Datei die ver- oder entschlüsselt werden soll.
@param[in] key Der Schlüssel mit der ver- oder entschlüsselt werden soll.
*/
QByteArray CryptoLib::ByteXOR(QByteArray inputfile, QByteArray key)
{

    QByteArray result;
    for(int i = 0 , j = 0; i < inputfile.length(); ++i , ++j)
    {
      if(j == key.length())
        j = 0; // so lange wiederholen bis inputfile.length() < data.length()
      result.append(inputfile.at(i) ^ key.at(j));
    }

    return result;
}
